package initialize

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/spf13/cobra"
	"github.com/spf13/viper"
)

const (
	defaultConfigPath = "configs"
	defaultConfigName = "product"
	defaultConfigType = "yaml"
)

// LoadConfig 加载配置文件
func LoadConfig() {
	// 查找项目根目录
	projectRoot, err := findProjectRoot()
	// 如果获取项目根目录失败，打印 `'Error: xxx` 错误，并退出程序（退出码为 1）
	cobra.CheckErr(err)

	// 将目录加入到配置文件的搜索路径中
	viper.AddConfigPath(filepath.Join(projectRoot, defaultConfigPath))

	// 设置配置文件格式为 YAML (YAML 格式清晰易读，并且支持复杂的配置结构)
	viper.SetConfigType(defaultConfigType)
	// 配置文件名称（没有文件扩展名）
	viper.SetConfigName(defaultConfigName)

	// 读取配置文件。如果指定了配置文件名，则使用指定的配置文件，否则在注册的搜索路径中搜索
	if err := viper.ReadInConfig(); err != nil {
		fmt.Fprintln(os.Stderr, err)
	}

	// 打印 viper 当前使用的配置文件，方便 Debug.
	fmt.Fprintln(os.Stdout, "Using config file:", viper.ConfigFileUsed())
}

// 查找项目根目录（基于 go.mod）
func findProjectRoot() (string, error) {
	// 从当前工作目录开始向上查找
	dir, err := os.Getwd()
	if err != nil {
		return "", err
	}
	for {
		// 检查当前目录是否存在 go.mod 文件
		if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
			return dir, nil
		}
		// 检查是否已到达根目录
		parentDir := filepath.Dir(dir)
		if parentDir == dir {
			return "", fmt.Errorf("找不到 go.mod 文件，无法确定项目根目录")
		}
		// 向上移动一层
		dir = parentDir
	}
}
